李守中
该站已迁往根域名 https://lishouzhong.com
需要注意,迁移后的文章的 url 可能会发生变化。
域名 https://note.lishouzhong.com 下的内容将不再更新,但已有内容会永久保留。

QEMU 相关

Table of Contents

1. .qcow2 磁盘文件的 L2 缓存

  • 每个 .qcow2 文件有一个 L1 table,它记录了所有的 L2 table 的信息
  • 每个 L2 table 记录了一个或多个 cluster 的信息
  • cluster_size 是 .qcow2 文件大小增长的最小梯度,默认是 64KiB,不能大于 2MiB
  • L2 table 的大小等于 cluster_size 的大小 (L2 table 和 cluster 使用的数据结构相同,只是里面存的东西不同)
  • QEMU 会在 l2-cache-size 和 8*cluster_size 中选一个较大的值作为 l2-cache-size 的大小

qemu-qcow2-l1-l2.png

  • 64KiB 的 L2 table,可以存储 8192 个 cluster 的地址,每个 L2 table 可以索引 8192 * 64 KiB = 0.5 GiB 的数据
  • 128KiB 的 L2 table,可以存储 16384 个 cluster 的地址,每个 L2 table 可以索引 16384 * 128 KiB = 2 GiB 的数据
  • 256KiB 的 L2 table,可以存储 32768 个 cluster 的地址,每个 L2 table 可以索引 32768 * 256 KiB = 8 GiB 的数据
  • 512KiB 的 L2 table,可以存储 65536 个 cluster 的地址,每个 L2 table 可以索引 65536 * 512 KiB = 32 GiB 的数据
  • 1024KiB 的 L2 table,可以存储 131072 个 cluster 的地址,每个 L2 table 可以索引 131072 * 1024 KiB = 128 GiB 的数据
  • 2048KiB 的 L2 table,可以存储 262144 个 cluster 的地址,每个 L2 table 可以索引 262144 * 2048 KiB = 512 GiB 的数据

注: 图片来源 https://www.ibm.com/blog/how-to-tune-qemu-l2-cache-size-and-qcow2-cluster-size/

为了读写 .qcow2 文件中的数据,QEMU 需要先根据 L2 table 找到数据的位置。由于每次 I/O 操作读取表的成本可能很高、L1 table 又足够小,为了提升性能,QEMU 会将 L1 table 放在内存中处理。而 L2 table 可能会很大,所以 QEMU 提供了一个参数 l2-cache-size 来控制有多少内存会被用于缓存 L2 table。

计算 l2-cache-size 的公式为 (in Byte):

disk_size = l2_cache_size * cluster_size / 8

Data cluster 大小的默认值是 64KiB。所以该公式可变形为:

disk_size = l2_cache_size * 8192

继续变形成容易计算的形式:

l2_cache_size = disk_size_GB * 131072



Last Update: 2023-10-03 Tue 21:58

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: lsz.sino@outlook.com

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议